package Day_0219.Redis;

/**
 * @author zxc
 * @date 2023/02/19 22:17
 **/
public class Redis_ExpirationPolicies {
    public static void main(String[] args) {
        /**
         * 谈一谈对于Redis中过期策略的理解
         * ===》
         * 一.Redis的过期策略
         * 1.redis 过期策略是：定期删除+惰性删除。
         *
         * 2.定期删除
         * （1）所谓定期删除，指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key，
         *  检查其是否过期，如果过期就删除。
         * （2）假设 redis 里放了 10w 个 key，都设置了过期时间，你每隔几百毫秒，就检查 10w 个 key，
         *  那 redis 基本上就死了，cpu 负载会很高的，消耗在你的检查过期 key 上了。
         *  注意，这里可不是每隔 100ms 就遍历所有的设置过期时间的 key，那样就是一场性能上的灾难。
         *  ===》
         *  总结 ：
         *  定期删除 ：即，Redis每隔 100ms 随机抽取一些key 来检查其是否过期 && 删除那些已经过期的key。
         *
         * 3.惰性删除
         * （1）定期删除可能会导致很多过期 key 到了时间并没有被删除掉，那咋整呢？
         * （2）惰性删除这就是说，
         *  在你获取某个 key 的时候，redis 会检查一下 ，这个 key 如果设置了过期时间那么是否过期了？
         *  如果过期了此时就会删除，不会给你返回任何东西。
         *  ===》
         *  总结 ：
         *  惰性删除 ：
         *  获取 key 的时候，Redis会去检查当前key是否已经过期，如果此时 key 已经过期，就删除，不会返回任何东西。
         *
         * 4.若是某些过期数据 一直未被使用到 && 定期删除也未能扫描到，
         * 即，会在Redis中，堆积大量过期数据，导致Redis宕机;
         * ===》
         * 为解决定期删除 + 惰性删除的弊端，同时使用 内存淘汰机制。
         *
         * 二，Redis的内存淘汰机制
         * redis 内存淘汰机制有以下几个：
         * （1）noeviction:
         *  当内存不足以容纳新写入数据时，新写入操作会报错。
         *
         * （2）allkeys-lru：
         *  当内存不足以容纳新写入数据时，在键空间（包括过期 && 未过期）中，移除最近最少使用的 key（这个是最常用的）。
         *
         * （3）allkeys-random：
         *  当内存不足以容纳新写入数据时，在键空间中，随机移除某个 key;
         *
         * （4）volatile-lru：
         *  当内存不足以容纳新写入数据时，在设置了（过期时间的键空间）中，移除最近最少使用的 key。。
         *
         * （5）volatile-random：
         *  当内存不足以容纳新写入数据时，在设置了过期时间的键空间中，随机移除某个 key。
         *
         * （6）volatile-ttl：
         *  当内存不足以容纳新写入数据时，在设置了过期时间的键空间中，优先移除 相比之下更早过期时间的key 。
         *
         */
    }
}
